package org.adream.account.service;

import java.util.List;

import javax.servlet.http.HttpSession;

import org.adream.account.dao.TagDao;
import org.adream.account.entity.TagEntity;
import org.adream.account.model.ResultModel;
import org.adream.account.util.Constant;
import org.adream.account.util.IdGenerator;
import org.adream.account.util.Utils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;

/**
 * 标签相关操作
 * 
 * @author chenhaoyu
 *
 */
@Service
public class TagService {
	
	private final static Logger logger = LoggerFactory.getLogger(TagService.class);

	@Autowired
	private TagDao tagDao;
	
	@Autowired  
	private HttpSession session;  

	/**
	 * 增
	 * @param tag
	 * @return
	 */
	public ResultModel<String> addTag(TagEntity tag) {
		tag.setTagId(IdGenerator.getGuid());
		String modifier = (String)session.getAttribute("uid");
		tag.setCreator(modifier);
		tag.setModifier(modifier);
		tag.setDr(Constant.ONE);
		int result = tagDao.addTag(tag);
		if(result == 0) {
			logger.warn("新增标签数据失败,数据库错误,tagName:{}", tag.getTagName());
			return new ResultModel<String>(ResultModel.ERR_SYS, "系统错误,请联系系统管理员", null);
		}
		return new ResultModel<String>(ResultModel.SUCCESS, ResultModel.SUCCESS_MSG, null);
	}
	
	/**
	 * 删
	 * @param id
	 * @return
	 */
	public ResultModel<String> deleteTag(String id) {
		TagEntity tag = tagDao.queryTagByDrAndTagId(Constant.ONE, id);
		if(tag == null) {
			logger.warn("删除标签失败,数据不存在,tagId:{}", id);
			return new ResultModel<String>(ResultModel.NOT_FOUND_OBJECT, "删除失败,数据不存在", null);
		}
		String modifier = (String)session.getAttribute("uid");
		tag.setModifier(modifier);
		tag.setDr(Constant.ZERO);
		int result = tagDao.deleteTag(tag);
		if(result == 0) {
			logger.warn("删除标签数据失败,数据库错误,tagId:{}", id);
			return new ResultModel<String>(ResultModel.ERR_SYS, "系统错误,请联系系统管理员", null);
		}
		return new ResultModel<String>(ResultModel.SUCCESS, ResultModel.SUCCESS_MSG, null);
	}
	
	/**
	 * 删除多个标签
	 * @param tagIds
	 * @return
	 */
	public ResultModel<String> deleteTags(String[] tagIds) {
		for (String tagId : tagIds) {
			deleteTag(tagId);
		}
		return new ResultModel<String>(ResultModel.SUCCESS, ResultModel.SUCCESS_MSG, null);
	}

	/**
	 * 改
	 * @param id
	 * @param tagEntity
	 * @return
	 */
	public ResultModel<String> updateTag(String id, TagEntity tagEntity) {
		TagEntity tag = tagDao.queryTagByDrAndTagId(Constant.ONE, id);
		if(tag == null) {
			logger.warn("删除标签失败,数据不存在,tagId:{}", id);
			return new ResultModel<String>(ResultModel.NOT_FOUND_OBJECT, "更新失败,数据不存在", null);
		}
		Utils.copyPropertiesIgnoreNull(tagEntity, tag);
		String modifier = (String)session.getAttribute("uid");
		tag.setModifier(modifier);
		int result = tagDao.updateTag(tag);
		if(result == 0) {
			logger.warn("更新标签数据失败,数据库错误,tagId:{}", id);
			return new ResultModel<String>(ResultModel.ERR_SYS, "系统错误,请联系系统管理员", null);
		}
		return new ResultModel<String>(ResultModel.SUCCESS, ResultModel.SUCCESS_MSG, null);
	}

	/**
	 * 根据id查询单个tag
	 * 
	 * @param tagId
	 * @return TagEntity
	 */
	public TagEntity queryTagById(String tagId) {
		return tagDao.queryTagByTagId(tagId);
	}

	/**
	 * 根据tag dr 状态查询符合 tags
	 * 
	 * @param dr
	 * @return
	 */
	public List<TagEntity> queryTagsByDr(int dr) {
		return tagDao.queryTagsByDr(dr);
	}

	/**
	 * 输入关键词实时提示相关标签 调用频率较高，故不写返回信息
	 * 
	 * @param keyWord
	 * @return
	 */
	public List<TagEntity> queryTagByKeyWord(String keyWord) {
		return tagDao.queryTagsByDrAndLikeTagName(Constant.ONE, keyWord);
	}
	
	/**
	 * 根据部分tagName查询tag
	 * @param dr  删除标志
	 * @param tagName tag name
	 * @return
	 */
	public List<TagEntity> queryTagsByDrAndLikeTagName(int dr, String tagName) {
		return tagDao.queryTagsByDrAndLikeTagName(dr, tagName);
	}

	/**
	 * 对tag进行查重
	 * 
	 * @param tagName
	 * @return true tag不存在-合法 false tag存在-不合法
	 */
	public Boolean isValidTagName(String tagName) {
		boolean isValidTagName = false;
		TagEntity tag = tagDao.queryTagByTagName(tagName);
		if (!StringUtils.isEmpty(tagName) && tag == null) {
			isValidTagName = true;
		}
		return isValidTagName;
	}
	
	/**
	 * 分页查询标签
	 * @param dr  删除标志  不为空
	 * @param pageNo  第几页
	 * @param pageSize  每页显示多少记录
	 * @return
	 */
	public PageInfo<TagEntity> selectPageTag(Integer dr,String tagName,Integer pageNo,Integer pageSize) {
		pageNo = (pageNo == null) ? Constant.ONE : pageNo;
		pageSize = (pageSize == null) ? Constant.TEN: pageSize;
		PageHelper.startPage(pageNo,pageSize);
		List<TagEntity> tags = tagDao.queryTagsByDrAndLikeTagName(dr, tagName);
		//封装Page对象，每页显示10条记录
		PageInfo<TagEntity> page = new PageInfo<>(tags,Constant.TEN);
		return page;
	}
	
	/**
	 * 检查标签是否存在
	 * 
	 * @param tagName
	 * @return tag
	 */
	public TagEntity queryTagByTagName(String tagName) {
		TagEntity tag = tagDao.queryTagByTagName(tagName);
		return tag;
	}
}